package com.indusfo.spc.controller;

import com.indusfo.spc.pojo.*;
import com.indusfo.spc.service.DeteService;
import com.indusfo.spc.untlis.GsonUtil;
import com.indusfo.spc.vo.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: DeteController
 * @Description: TODO
 * @author: 余家能
 * @date: 2018/11/26 上午10:45
 */
@Controller
@RequestMapping("/Dete")
public class DeteController {

	@Autowired
	private DeteService deteService;

	/*
	查询检测项目
	http://localhost:8080/service/Dete/queryDete?pagesize=3&pageindex=2
	 */
	@RequestMapping(value="/queryDete")
	@ResponseBody
	public JSONObject queryDete(Dete Dete) {
		JSONObject jsonObject = deteService.listDete(Dete);
		return jsonObject;
	}




	/**
	 * http://localhost:8080/service/Dete/insertDete?vcDetej=qqqqq&vcDeteName=中文&vcDeteUnit=1&vcStandard=sdd&vcRemark=1&lDataState=1&lInsType=1
	 * 新增/更新检测项目
	 * @param
	 * @return
	 */
	@RequestMapping(value="/insertDete")
//	@RequiresPermissions("Dete:shiro:insert")
	@ResponseBody
	public JSONObject insertDete(Dete Dete) {
		JSONObject jsonObject = deteService.insertOrUpdateDete(Dete);
		return jsonObject;
	}

	@RequestMapping(value="/updateDete")
//	@RequiresPermissions("Dete:shiro:update")
	@ResponseBody
	public JSONObject updateDete(Dete Dete) {
		JSONObject jsonObject = deteService.insertOrUpdateDete(Dete);
		return jsonObject;
	}

	/**
	 * http://localhost:8080/service/Dete/deleteDete?lDetejs=1,2,3&lDataState=2
	 * 删除/停用/启用检测项目
	 * @param deteIds
	 * @param dataState
	 * @return
	 */
	@RequestMapping(value="/definesDete")
//	@RequiresPermissions("Dete:shiro:defines")
	@ResponseBody
	public JSONObject definesPro(Long[] deteIds, Integer dataState) {
		JSONObject jsonObject = deteService.deleteDete(deteIds, dataState);
		return jsonObject;
	}

	/**
	 * @Description: 检测项目删除
	 * @Params: [deteIds, dataState]
	 * @Returns: com.indusfo.spc.vo.JSONObject
	 * @author: 余家能
	 * @date: 2018/12/21 下午3:53
	 */
	@RequestMapping(value="/deleteDete")
//	@RequiresPermissions("Dete:shiro:delete")
	@ResponseBody
	public JSONObject delDete(Long[] deteIds, Integer dataState) {
		JSONObject jsonObject = deteService.deleteDete(deteIds, dataState);
		return jsonObject;
	}
	@RequestMapping("/uploadFileDete")
	@ResponseBody
	public JSONObject uploadFileUser(@RequestParam("file") MultipartFile file, Boolean way, HttpServletRequest request, HttpServletResponse response) throws IOException, ParseException {
		//定义一个message对象用于向前台传输数据
		Message msg = new Message();
		//设置错误集合的
		List<ExcelErrorData> errorDatas = new ArrayList<>();
		response.setContentType("text/html;charset=UTF-8");
		//判断上传文件格式是否正确
		Workbook wb = ExcelUtil.getWorkbook(file.getInputStream(), ExcelUtil.isExcel2007(file.getOriginalFilename()));
		if (wb == null) {
			errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "文件解析错误"));
		} else {
			//获取excel文件的第一个sheet
			Sheet sheet = wb.getSheetAt(0);
			if (sheet == null) {
				msg.setCode(2);
				msg.setMsg("未找到需要导入的表格");
				errorDatas.add(ExcelErrorData.getExcelErrorData(0, 0, "未找到需要导入的表格"));
			} else {
				//获取最后一行的行号
				int rowCount = sheet.getLastRowNum();
				if (rowCount < 1) {
					msg.setCode(1);
					msg.setMsg("未找到需要导入的数据，请确认表格是否保存！！！");
					errorDatas.add(ExcelErrorData.getExcelErrorData(0, "未找到需要导入的数据，请确认表格是否保存！！！"));
				} else {
					List<Dete> addProductPlans = new ArrayList<>();
					for (int i = 1; i <= rowCount; i++) {
						boolean needAdd = true;
						//获取到每一行的每一列的数据
						//检测项目编码
						String vcDetej =com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 0, false);
						//检测项目名称
						String vcDeteName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 1, false);
						//仪器类型
						String lInsTypeName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 2, false);
						//单位
						String lDeteUnitName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 3, false);
						//采集类型
						String gatherTypeName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 4, false);
						//项目类型
						String projectTypeName = com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, i, 5, false);
						Dete plan = new Dete(vcDetej,vcDeteName,lDeteUnitName,lInsTypeName,projectTypeName,gatherTypeName);
						int m = i + 1;
						//将excel中的每一行数据存储进行检查
						String result = deteService.checkNoRepeat(plan);
						if(result!=null){
							errorDatas.add(ExcelErrorData.getExcelErrorData(i, result));
							needAdd=false;
						}
						for (int j = 1; j < i; j++) {
							//判断检测项目编码
							String oldvcDetej = StringUtils.trimToEmpty(com.indusfo.spc.untlis.ExcelUtil.getCellValue(sheet, j, 0, false)).replaceAll("\\s*", "");
							if (StringUtils.isBlank(vcDetej) && oldvcDetej.equals(vcDetej)) {
								needAdd = false;
								errorDatas.add( ExcelErrorData.getExcelErrorData(i, "与表格中第" + j + "行存在相同检测项目编码"));
							}
						}
						if (needAdd) {
							addProductPlans.add(plan);
						} else {
							msg.setCode(2);
							msg.setMsg("导入数据中存在异常信息");
						}

					}
					//根据这些来判断是否是中止导入还是跳过继续进行导入
					if (msg.getCode() == 2 && !way) {
						msg.setMsg(msg.getMsg() + ",中止导入");
					} else {
						if (addProductPlans.size() > 0) {
							try {
								deteService.updateListDete(addProductPlans);
								//当程序执行到这里时,判断信息是否为空为空的话设置导入成功
								msg.setMsg(StringUtils.isBlank(msg.getMsg()) ? "导入成功" : msg.getMsg());
								if ("导入成功".equals(msg.getMsg())) {
									msg.setCode(1);
								}
							} catch (Exception e) {
								e.printStackTrace();
								msg.setMsg("导入失败");
							}
						}
					}
					//msg.setData(GsonUtil.toJson(errorDatas));
				}
			}
		}
		msg.setData(GsonUtil.toJson(errorDatas));
		//response.getWriter().println(GsonUtil.toJson(msg));
		String s = GsonUtil.toJson(msg);
		return JSONObject.build(200,msg.getMsg(),errorDatas);
	}

}
